"""
任务相关 form
"""

from django import forms
from sa.forms.bootstrap import BootStrapForm
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from sa import models
from django.utils import timezone


class TaskModelForm(BootStrapForm, forms.ModelForm):
    bootstrap_class_exclude = []

    class Meta:
        model = models.Task
        exclude = ['creator', 'project', 'task_number', 'software_type']
        widgets = {
            'task_date': forms.DateInput(attrs={'type': 'date'}),
            'start_time': forms.TimeInput(attrs={'type': 'time'}),
            'end_time': forms.TimeInput(attrs={'type': 'time'}),
        }

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_sub_number(self):
        # pk 拿到主键当前id：  self.instance.pk 就是获取当前模型实例的主键值。
        # instance通常用来表示一个模型实例
        # 当你处理一个已经存在的模型对象时，比如编辑一个已经存在的记录，你会用到这个模型实例。
        # 在表单中，如果设置了instance属性，那么表单的初始值将会根据这个模型实例来填充。
        primary = self.instance.pk
        sub_number = self.cleaned_data.get('sub_number')
        if sub_number is None:
            raise ValidationError('不能为空！')
        # exclude 排除了当前id后，号码不能重复

        exist = models.Task.objects.exclude(id=primary).filter(
            project=self.request.project, sub_number=sub_number).exists()
        if exist:
            raise ValidationError('Task No# 已经存在')
        return sub_number

    def clean_task_date(self):
        target = self.request.project.start_date
        task_date = self.cleaned_data.get('task_date')
        date_now = timezone.now().date()
        if task_date < target:
            raise ValidationError('任务日期不能早于项目开始日期！')
        if task_date > date_now:
            raise ValidationError('任务日期不能晚于当前日期!')
        return task_date

    def clean_overtime(self):
        overtime = self.cleaned_data.get('overtime', 0)
        if overtime == 0:
            return overtime
        import re
        target = r'^[0-9]+$'
        match = re.match(target, str(overtime))
        if match is None:
            raise ValidationError('格式不正确！')
        return overtime

    def clean_total_time(self):
        overtime = self.cleaned_data.get('overtime', 0)
        total_time = self.cleaned_data.get('total_time', 0)
        if total_time < 0:
            raise ValidationError('结束时间错误')
        if total_time < overtime:
            raise ValidationError('总计时间不能小于加班时间')
        return total_time
